<?php
namespace helper;
class Arr {
	public static function order(&$array,$key='order'){
		usort($array, function($a, $b) use ($key) {
		    return $a[$key] <=> $b[$key];
		});
		return $array;
	}
	// 设置数组指定路径的值
	public static function set($array,$path,$value,$type=null){
		$keys=self::split($path,'.');
		$key=array_shift($keys);
	
		if(count($keys) === 0){
			if(self::checkType($value,$type)){
				$array[$key] = $value;
			}
		}else{
			if(!isset($array[$key])){
				$array[$key]=[];
			}
			if(is_array($array[$key])){
				$array[$key]=self::set($array[$key],$keys,$value);
			}
		}
		return $array;
	}
	// 获取数组指定路径的值
	public static function get($array,$path,$default=null,$type=null){
		$value=$default;
		if(is_array($array)){
			$keys=self::split($path,'.');
			$value=$array;
			while($key=array_shift($keys)){
				$value=$value[$key];
			}
		}
		if($type and self::checkType($value,$type)){
			return $value;
		}
		return $value?$value:$default;
	}
	// 根据键名提取数字里的值
	public static function extract(array $array,array $keys){
		$result = [];
		$keys = self::split($keys);
		foreach ($keys as $index => $key) {
			if(!is_numeric($index)) {
				if (isset($array[$index])) {
					$result[$key] = $array[$index];
				}
			} elseif (isset($array[$key])) {
				$result[$key] = $array[$key];
			}
		}
		return $result;
	}
	// 检测是否是关联数组
	public static function isAssoArr($array){
		if (!is_array($array)) {
			return false;
		}
		return array_keys($array) !== range(0, count($array) - 1);
	}
	
	// 字符串拆分成数组
	public static function split($str,$glue=','){
		if(!is_array($str)){
			if($str==='' or is_null($str)){
				return [];
			}
			return explode($glue,$str);
		} else {
			return $str;
		}
	}
	// 数组拼接成字符串
	public static function join($array,$glue=','){
		if(is_array($array)){
			return implode($glue,$array);
		} else {
			return $array;
		}
	}
	public static function sign($data){
		$data=self::split($data);
		ksort($data);
		$string=http_build_query($data);
		$sign=md5($string);
		return $sign;
	}
	public static function hash($data){
		$data=array_unique(array_filter(self::split($data)));
		if($data){
			sort($data);
			return md5(self::join($data,'-'));
		}
		return null;
	}
	
	
	// 合并数组 重建索引
	// 传入 ['a'=>1,'b'=>2],['b'=>22,'c'=>3];
	// 结果 [1,2,22,3];
	public static function merge(){
		$args=func_get_args();
		// 如果传入了true则为深度合并
		$deep=in_array(true,$args,true);
		$result=[];
		foreach($args as $array){
			if(is_string($array)){
				$array=self::split($array);
			}
			if(is_array($array)){
				if($deep){
					$result=array_merge_recursive($result,$array);
				}else{
					$result=array_merge($result,$array);
				}
			}
		}
		return $result;
	}
	// 数组相加 不覆盖 不重建索引
	// 传入 ['a'=>1,'b'=>2],['b'=>22,'c'=>3];
	// 结果 ['a'=>1,'b'=>2,'c'=>3];
	public static function plus(){
		$args=func_get_args();
		$result=[];
		foreach($args as $array){
			if(is_string($array)){
				$array=self::split($array);
			}
			if(is_array($array)){
				$result=$result+$array;
			}
		}
		return $result;
	}
	// 扩展数组 覆盖 不重建索引
	// 传入 ['a'=>1,'b'=>2],['b'=>22,'c'=>3];
	// 结果 ['a'=>1,'b'=>22,'c'=>3];
	public static function extend(){
		$args=func_get_args();
		$deep=in_array(true,$args,true);
		$result=[];
		foreach($args as $array){
			if(is_string($array)){
				$array=self::split($array);
			}
			if(is_array($array)){
				foreach($array as $key=>$value){
					if($deep and is_array($value)){
						$result[$key]=self::extend($result[$key],$value,true);
					}else{
						$result[$key]=$value;
					}
				}
			}
		}
		return $result;
	}
	
	// 检测类型
	// 如果类型传入数组 则检测是否在数组中
	// 如果类型传入字符串 则检测是否为该类型
	// 如果类型传入dir 则检测是否为目录
	// 如果类型传入file 则检测是否为文件
	public static function checkType($value,$type){
		if(is_array($type)){
			return in_array($value,$type,true);
		}elseif($type){
			if($type=='dir'){
				return is_dir($value);
			}else if($type=='file'){
				return is_file($value);
			}
			return in_array(gettype($value),self::split($type,'|'));
		}
		return true;
	}
}